package com.demo.javaee.ref_type;

import java.util.concurrent.TimeUnit;

/**
 * @author shenguangyang
 */
public class ThreadLocalDemo {
    // 应用场景: springboot 事务控制, 将connection放入到 threadLocal 中
    static ThreadLocal<Person> tl = new ThreadLocal<>();
    public static class Person {
        String name;

        @Override
        protected void finalize() throws Throwable {
            super.finalize();
            System.out.println("------------------------- finalize");
        }

        public Person(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    '}';
        }
    }

    /**
     * 为什么Enty要使用弱引用？
     * 若是强引用，即使t=nul, key的引用依然指向 ThreadLocal 对象，所以会有内行
     * 泄漏，血使用弱引用则不会
     *
     * 但还是有内存泄漏存在，ThreadLocal被回收，key的值变成null,则导致整个value再
     * 也无法被访问到，因此依然仔在内仔泄漏
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        tl.set(new Person("xxx"));
        System.out.println(tl.get());
        // tl.remove();
        System.gc();
        TimeUnit.SECONDS.sleep(1);
        System.out.println(tl.get());
    }
}
